perm filename CREATE.SAI[4,KMC] blob sn#180016 filedate 1975-10-04 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	DUP_SP finds duplicates (and other simple errors) in SPATS.INT
C00007 00003	PROC DUP_CP
C00009 ENDMK
C⊗;
COMMENT DUP_SP finds duplicates (and other simple errors) in SPATS.INT
	and write SPATS.NEW, NEGATE.NEW and FAMLY.NEW ;

BEGIN

REQUIRE "IODEFS.SAI[SEC,RCP]" SOURCE_FILE;

PROC DUP_SP;
	BEGIN
	INTEGER OUCH3, OUCH4, TYPES;
	STRING LINE, PAT;
	SAFE STRING ARRAY NUMS, PARTS, NAME[0:3];
	FILIN("SPATS.INT[PAR,RCP]", INCH1);
	FILOUT("SPATS.NEW[PAR,RCP]", OUCH1);
	FILOUT("SPATS.ERR[PAR,RCP]", OUCH2);
	FILOUT("NEGATE.NEW[PAR,RCP]", OUCH3);
	FILOUT("FAMLY.NEW[PAR,RCP]", OUCH4);
	BREAK_LINE;
	BREAK_LISP;
	NAME[0] ← "PLAIN";
	NAME[1] ← "NEGATE";
	NAME[2] ← "FAMILY";
	NAME[3] ← "NEGFAM";
	PAT ← NULL;
	FOR TYPES ← 0 TIL 3 DO
		BEGIN
		NUMS[TYPES] ← NULL;
		PARTS[TYPES] ← NULL;
		END;
	LINE ← IN_LINE;
	WHILE ¬EOF DO
		BEGIN "Loop"
		STRING PAT2;
		INTEGER TYPE;
		STRING ARRAY LIST0[0:10];
		IF ¬LINE THEN
			BEGIN
			LINE ← IN_LINE;
			CONTINUE "Loop";
			END;
		DISSECT(LINE, LIST0, TRUE);
		PAT2 ← LIST0[1];
TYPE ← (IF LIST0[2] = "T" THEN 1 ELSE 0) + (IF LIST0[3] = "T" THEN 2 ELSE 0);
		IF EQU(PAT2, PAT) THEN
			BEGIN "Another"
			IF ¬NUMS[TYPE] THEN
				BEGIN
				NUMS[TYPE] ← LIST0[5];
				PARTS[TYPE] ← LIST0[4];
				END
			ELSE IF LIST0[4] = PARTS[TYPE] THEN
				NUMS[TYPE] ← NUMS[TYPE] ∂ LIST0[5]
			ELSE IF PARTS[TYPE] = "T" THEN
				BEGIN
				NUMS[TYPE] ← LIST0[5];
				PARTS[TYPE] ← "NIL";
				END;
			END "Another"
		ELSE	BEGIN "Different"
			FOR TYPES ← 0 TIL 3 DO
				IF NUMS[TYPES] THEN
					BEGIN
IF TYPES = 0 THEN OUT_PAIR(OUCH1, PAT, NUMS[0][1 TO 5])
ELSE IF TYPES = 1 THEN
	IF NUMS[0] THEN OUT_PAIR(OUCH3, NUMS[0][1 TO 5], NUMS[1][1 TO 5])
	ELSE OUT_PAIR(OUCH2, "Need plain for", PAT ∂ NAME[1] ∂ NUMS[1])
ELSE IF TYPES = 2 THEN
	IF NUMS[0] THEN OUT_PAIR(OUCH4, NUMS[0][1 TO 5], NUMS[2][1 TO 5])
	ELSE OUT_PAIR(OUCH2, "Need plain for", PAT ∂ NAME[2] ∂ NUMS[2])
ELSE IF NUMS[1] THEN OUT_PAIR(OUCH4, NUMS[1][1 TO 5], NUMS[3][1 TO 5])
ELSE OUT_PAIR(OUCH2, "Need negative for", PAT ∂ NAME[3] ∂ NUMS[3]);
IF LENGTH(NUMS[TYPES]) > 5 THEN
OUT_PAIR(OUCH2, IF PARTS[TYPES] = "T" THEN "Pick one" ELSE "Too many",
PAT ∂ NAME[TYPES] ∂ NUMS[TYPES]);
					END;
			FOR TYPES ← 0 TIL 3 DO
				BEGIN
				NUMS[TYPES] ← NULL;
				PARTS[TYPES] ← NULL;
				END;
			PAT ← PAT2;
			NUMS[TYPE] ← LIST0[5];
			PARTS[TYPE] ← LIST0[4];
			END "Different";
		LINE ← IN_LINE;
		END "Loop";
	FOR TYPES ← 0 TIL 3 DO
		IF NUMS[TYPES] THEN
			BEGIN
IF TYPES = 0 THEN OUT_PAIR(OUCH1, PAT, NUMS[0][1 TO 5])
ELSE IF TYPES = 1 THEN
	IF NUMS[0] THEN OUT_PAIR(OUCH3, NUMS[0][1 TO 5], NUMS[1][1 TO 5])
	ELSE OUT_PAIR(OUCH2, "Need plain for", PAT ∂ NAME[1] ∂ NUMS[1])
ELSE IF TYPES = 2 THEN
	IF NUMS[0] THEN OUT_PAIR(OUCH4, NUMS[0][1 TO 5], NUMS[2][1 TO 5])
	ELSE OUT_PAIR(OUCH2, "Need plain for", PAT ∂ NAME[2] ∂ NUMS[2])
ELSE IF NUMS[1] THEN OUT_PAIR(OUCH4, NUMS[1][1 TO 5], NUMS[3][1 TO 5])
ELSE OUT_PAIR(OUCH2, "Need negative for", PAT ∂ NAME[3] ∂ NUMS[3]);
IF LENGTH(NUMS[TYPES]) > 5 THEN
OUT_PAIR(OUCH2, IF PARTS[TYPES] = "T" THEN "Pick one" ELSE "Too many",
PAT ∂ NAME[TYPES] ∂ NUMS[TYPES]);
			END;
	RELEASE(INCH1);
	RELEASE(OUCH1);
	RELEASE(OUCH2);
	RELEASE(OUCH3);
	RELEASE(OUCH4);
	END;
PROC DUP_CP;
	BEGIN
	STRING THIS, NEXT;
	STRING ARRAY LIST1, LIST2[0:10];
	FILIN("CPATS.INT[PAR,RCP]", INCH1);
	FILOUT("CPATS.NEW[PAR,RCP]", OUCH1);
	FILOUT("CPATS.ERR[PAR,RCP]", OUCH2);
	BREAK_LINE;
	BREAK_LISP;
	THIS ← IN_LINE;
	DISSECT(THIS, LIST1, TRUE);
	NEXT ← IN_LINE;
	WHILE ¬EOF DO
		BEGIN
		DISSECT(NEXT, LIST2, TRUE);
 		IF LENGTH(LIST1[1]) ≤ 7 THEN
			BEGIN
IF ¬EQU(LIST1[1][2 TO 6],LIST1[2]) THEN OUT_PAIR(OUCH2, "Error", THIS);
			END
		ELSE IF EQU(LIST1[1], LIST2[1]) THEN
OUT_PAIR(OUCH2, "Too many", LIST1[1] ∂ LIST1[2] ∂ LIST2[2])
		ELSE OUT_LINE(THIS);
		THIS ← NEXT;
		FOR I ← 0 TIL LIST2[0] DO LIST1[I] ← LIST2[I];
		NEXT ← IN_LINE;
		END;
	IF LENGTH(LIST1[1]) = 7 THEN
		BEGIN
IF ¬EQU(LIST1[1][2 TO 6],LIST1[2]) THEN OUT_PAIR(OUCH2, "Error", THIS);
		END
	ELSE OUT_LINE(THIS);
	RELEASE(INCH1);
	RELEASE(OUCH1);
	RELEASE(OUCH2);
	END;

IF GET_A_STRING("dup_Sp, dup_Cp") = "S" THEN DUP_SP ELSE DUP_CP;

END